package com.sugar.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectDemo1 {
    public static void main(String[] args) throws Exception {

        /**
         * 普通
         */
//        // 1. 直接使用构造函数创建对象
//        Person person = new Person("John", 30);
//
//        // 2. 直接访问字段并修改值
//        person.setName("Alice");
//
//        // 3. 直接调用方法
//        person.greet();
//
//        // 4. 直接调用getter方法
//        String name = person.getName();
//        System.out.println("Name: " + name);

        /**
         * 反射
         */
        // 1. 获取Class对象
        Class<?> personClass = Class.forName("com.sugar.reflection.Person");

        // 2. 获取构造函数并创建对象
        Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
        Object personInstance = constructor.newInstance("John", 30);
        System.out.println(constructor);

        // 3. 访问字段并修改值
        Field nameField = personClass.getDeclaredField("name");
        nameField.setAccessible(true); // 允许访问私有字段
        nameField.set(personInstance, "Alice");

        // 4. 获取方法并调用
        Method greetMethod = personClass.getDeclaredMethod("greet");
        greetMethod.invoke(personInstance);

        // 5. 获取并调用getter方法
        Method getNameMethod = personClass.getDeclaredMethod("getName");
        String name1 = (String) getNameMethod.invoke(personInstance);
        System.out.println("Name: " + name1);


    }
}
